home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 4 / United Public Domain Gold 4.iso / fredfish / ff.0316.dms / ff.0316.adf / SmartIcon / src / iconify.c < prev    next >
C/C++ Source or Header  |  1990-02-06  |  3KB  |  126 lines

  1. #include <intuition/intuisup.h>
  2. #include "patch.h"
  3.  
  4. #ifndef DEBUG
  5. #include <proto/all.h>
  6. #endif
  7.  
  8. extern struct ListSupport  *DList;
  9. extern struct HiddenWindow HList;
  10. extern struct MsgPort      *IDCMPReplyPort;
  11.  
  12.  
  13. VOID
  14. HideWindow(window)
  15. register struct   Window   *window;
  16. {
  17.    register struct   Screen      *screen = window->WScreen;
  18.    register struct   Layer       *layer;
  19.    register struct   Layer_Info  *linfo;
  20.  
  21.    Forbid();
  22.    layer = window->RPort->Layer;
  23.    linfo = layer->LayerInfo;
  24.  
  25.    SizeLayer(linfo, layer, 1-window->Width, 1-window->Height);
  26.    MoveLayer(linfo, layer,
  27.              screen->Width  - window->LeftEdge - 1,
  28.              screen->Height - window->TopEdge  - 1);
  29.    ShowTitle(screen, TRUE);
  30.    MakeScreen(screen);
  31.    Permit();
  32. }
  33.  
  34. VOID
  35. RevealWindow(window)
  36. register struct   Window   *window;
  37. {
  38.    register struct   Screen       *screen = window->WScreen;
  39.    register struct   Layer        *layer;
  40.    register struct   Layer_Info   *linfo;
  41.    register struct   IntuiMessage *msg = New(struct IntuiMessage, 1);
  42.  
  43.    Forbid();
  44.    layer = window->RPort->Layer;
  45.    linfo = layer->LayerInfo;
  46.  
  47.    MoveLayer(linfo, layer,
  48.              window->LeftEdge - screen->Width  + 1,
  49.              window->TopEdge  - screen->Height + 1);
  50.    SizeLayer(linfo, layer, window->Width-1, window->Height-1);
  51.    WindowToFront(window);
  52.    Permit();
  53.  
  54.    /* Send the window a fake IDCMP message to tell it to refresh itself.   */
  55.    /* Try both REFRESH and NEWSIZE, for most programs will refresh only    */
  56.    /* on when they get the last.                                           */
  57.    if (msg)
  58.       {
  59.       if (window->IDCMPFlags & REFRESHWINDOW) msg->Class = REFRESHWINDOW;
  60.       else if (window->IDCMPFlags & NEWSIZE)  msg->Class = NEWSIZE;
  61.       if (msg->Class)
  62.          {
  63.          msg->ExecMessage.mn_Node.ln_Type = NT_MESSAGE;
  64.          msg->ExecMessage.mn_ReplyPort    = IDCMPReplyPort;
  65.          msg->IAddress = msg->IDCMPWindow = window;
  66.          PutMsg(window->UserPort, msg);
  67.          WaitPort(IDCMPReplyPort);
  68.          while (GetMsg(IDCMPReplyPort));
  69.          Delete(msg, 1);
  70.          }
  71.       }
  72. }
  73.  
  74. VOID
  75. FixDisplay(reset)
  76. BOOL reset;
  77. {
  78.    /* Reset the display list   */
  79.    DList->Header = (LONG)HList.Next;
  80.    DList->Next   = (LONG)&HList.Next->Next;
  81.    DList->Text   = (LONG)&HList.Next->Title;
  82.    if (reset) ls_WarmStartFileIO(DList);
  83. }
  84.  
  85. VOID Iconify(window, refresh)
  86. register struct Window *window;
  87. BOOL     refresh;
  88. {
  89.    register struct HiddenWindow  *hidden = New(struct HiddenWindow, 1);
  90.    if (hidden)
  91.       {
  92.       /* Link it to our main list */
  93.       hidden->Next = HList.Next;
  94.       HList.Next   = hidden;
  95.  
  96.       /* Fill the structure data  */
  97.       hidden->Window = window;
  98.       hidden->Title  = window->Title;
  99.  
  100.       HideWindow(window);
  101.  
  102.       if (refresh) FixDisplay(TRUE);
  103.       }
  104. }
  105.  
  106. VOID UnIconify(hidden, refresh)
  107. register struct HiddenWindow *hidden;
  108. BOOL     refresh;
  109. {
  110.    struct   HiddenWindow  *h = HList.Next, *previous = NULL;
  111.  
  112. #ifdef DEBUG
  113. printf("uniconifying [%s]\n", hidden->Title);
  114. #endif
  115.  
  116.    RevealWindow(hidden->Window);
  117.  
  118.    while(h != hidden) { previous = h; h = h->Next; }
  119.  
  120.    if (previous) previous->Next = hidden->Next;
  121.    else HList.Next = hidden->Next;
  122.    CheckDelete(hidden, 1);
  123.  
  124.    if (refresh) FixDisplay(TRUE);
  125. }
  126.